package com.joker.product;

import com.joker.common.security.annotation.EnableCustomConfig;
import com.joker.common.security.annotation.EnableRyFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
 * 系统模块
 *
 * @author joker
 */
@EnableCustomConfig
@EnableRyFeignClients
@SpringBootApplication
public class JokerProductApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(JokerProductApplication.class, args);
        System.out.println("(♥◠‿◠)ﾉﾞ  系统模块启动成功   ლ(´ڡ`ლ)ﾞ  \n" +
                " .-------.       ____     __        \n" +
                " |  _ _   \\      \\   \\   /  /    \n" +
                " | ( ' )  |       \\  _. /  '       \n" +
                " |(_ o _) /        _( )_ .'         \n" +
                " | (_,_).' __  ___(_ o _)'          \n" +
                " |  |\\ \\  |  ||   |(_,_)'         \n" +
                " |  | \\ `'   /|   `-'  /           \n" +
                " |  |  \\    /  \\      /           \n" +
                " ''-'   `'-'    `-..-'              ");
    }

    public static class Cardioid extends JFrame {

        // 定义窗口大小
        private static final int WIDTH = 1920;
        private static final int HEIGHT = 1080;

        // 获取屏幕大小
        private static final int WINDOW_WIDTH = Toolkit.getDefaultToolkit().getScreenSize().width;
        private static final int WINDOW_HEIGHT = Toolkit.getDefaultToolkit().getScreenSize().height;

        // 图像和绘图缓存
        private Image image;
        private Graphics pic;

        // 控制绘制的变量
        private double z = 0.0;
        private double size = 10;
        private int jj = 0;
        private double expansionFactor = 1.0; // 控制扩展和收缩的因子

        public Cardioid() {
            // 设置窗口标题
            super("李峋♥爱心");

            // 设置窗口背景色
            this.setBackground(Color.BLACK);

            // 设置窗口位置
            this.setLocation((WINDOW_WIDTH - WIDTH) / 2, (WINDOW_HEIGHT - HEIGHT) / 2);

            // 设置窗口大小
            this.setSize(WIDTH, HEIGHT);

            // 启用双缓冲
            this.setIgnoreRepaint(true);

            // 设置窗口可见
            this.setVisible(true);

            // 设置窗口的默认关闭方式
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            // 使用 Timer 控制绘制的频率
            Timer timer = new Timer(16, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    repaint();
                }
            });
            timer.start();
        }

        // 绘制图形的方法
        @Override
        public void paint(Graphics g) {
            if (image == null) {
                image = this.createImage(WIDTH, HEIGHT); // 只创建一次图像对象
                pic = image.getGraphics();
            }

            // 每次绘制之前清空画布
            pic.setColor(Color.BLACK);
            pic.fillRect(0, 0, WIDTH, HEIGHT);

            // 控制绘制频率和效果
            if (jj % 2 == 0) {
                size = 14.5;
            } else {
                size = 15;
            }

            // 使用一个正弦函数来控制扩展和收缩
            // 减少 z 的增量，降低跳动的频率，使跳动更慢
            expansionFactor = 1.0 + 0.2 * Math.sin(z); // 使得扩展和收缩周期性变化

            for (int ii = 30; ii > 0; ii--) {
                Color color = new Color(255, 175, (int) (20 * Math.random()) + 220); // 随机颜色
                for (int i = 1; i < 400; i++) {
                    int px = (int) (Math.random() * 10);
                    int py = (int) (Math.random() * 10);

                    // 计算爱心的 x 坐标
                    double x = 16 * (Math.sin(z) * Math.sin(z) * Math.sin(z)) * size
                            + Math.pow((-1), px) * Math.random() * ii * Math.sqrt(ii) + WIDTH / 2;

                    // 计算爱心的 y 坐标
                    double y = -(13 * Math.cos(z) - 5 * Math.cos(2 * z) - 2 * Math.cos(3 * z) - Math.cos(4 * z))
                            * size + Math.pow((-1), py) * Math.random() * ii * Math.sqrt(ii) + HEIGHT / 3;

                    // 使用扩展因子来改变距离中心的点的大小
                    x = WIDTH / 2 + (x - WIDTH / 2) * expansionFactor;
                    y = HEIGHT / 3 + (y - HEIGHT / 3) * expansionFactor;

                    z += (Math.PI / 2.0) / 200; // 控制 z 的增量，减少增量减缓跳动的速度

                    pic.setColor(color);
                    pic.fillOval((int) x, (int) y, 2, 2);
                }
            }

            jj++;

            // 将缓存的图像绘制到屏幕上
            g.drawImage(image, 0, 0, this);
        }

        public static void main(String[] args) {
            new Cardioid();
        }
    }
}
